package com.egitim.cati.form;

 
import javax.ejb.Stateful;
import javax.inject.Inject;
import javax.mail.MessagingException;
import javax.persistence.NonUniqueResultException;

import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.util.value.ValueMap;
import org.jboss.solder.logging.Logger;
 
import com.egitim.util.UtilityMailClient;
import com.egitim.util.UtilityPassPhrase;
import com.egitim.util.UtilityUserAction;
 
 

// RegForm adlı sınıf, HTML tarafındaki regForm adlı HTML etiketinin
// Java tarafındaki karşılığıdır.
@Stateful
public final class RegForm extends Form<ValueMap>
{
	  
	private static String sirketAdi="Budun ";
	private static final long serialVersionUID = 1L;

    @Inject  UtilityUserAction userAction;
 
	@Inject
    private Logger log;
    
	private String message;
	
 
    public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public RegForm(final String id)
    {
        //Fâtih ile birlikte 24:41, 02.05.2012'de göz attık.
    	
    	// Alt satırdaki kod bloğu, HTML İçeriğini, Java'daki Form nesnesine (RegForm) aktarmak için.
        super(id, new CompoundPropertyModel<ValueMap>(new ValueMap()));

        
        //Alt satırdaki kod bloğu, HTML içeriğindeki, Email kutusunu temsîl ediyor.
        TextField<String> regEmail=new TextField<String>("regEmail");
	     
        //HTML içeriğindeki Email kutusunu temsîl eden regEmail adlı Java Nesnesini,
        // gene HTML içeriğindeki Form etiketine karşılık gelen RegForm'a bildirmek için
        //aşağıdaki kod satırını yazıyorum.
        //add, İngilizce'de eklemek mânâsına geliyor.
        // Yâni, regEmail nesnesini, regForm nesnesine ekleyerek, bildirme işlemi yapıyoruz.
        
        add(regEmail.setType(String.class));
       
        
        Label emailHata;
        PropertyModel<String> messageModel = new  PropertyModel<String> (this, "message");
        emailHata = new Label("emailHata", messageModel);
        
        add(emailHata);
	 
        //HTML içeriğindeki, "kaydet" adlı buttonun, Java tarafındaki temsîlidir.
	    Button  kaydet=new Button("kaydet"){
	       private static final long serialVersionUID = 1L;

			@Override
	    	public void onSubmit() {
	    		// TODO Auto-generated method stub
	    		super.onSubmit();
	    		 
	    	    
	    	}
	    };
	    
	    // "kaydet" adlı Java nesnesini, regForm'a eklemek için add adlı methodu kullanıyoruz.
	           add(kaydet);
	           
	            
     }

    /**
     * Show the resulting valid edit
     */
    @Override
    public final void onSubmit()
    {
    	
     
        try {
           
        	ValueMap values = getModelObject();
           
        	String email=values.getString("regEmail");
        	
            String password= UtilityPassPhrase.getNext(8);
       
           
            userAction.setPassword(password);
		    userAction.setUsername(email);
		    
		    register();
          
		} catch (NonUniqueResultException e) {
			// TODO Genel bir hatâ yakalama sınıfı yazılabilir.
			 setMessage("Aynı eposta adresi ile, daha önce kayıt yapılmıştır.");
			 e.printStackTrace();
			
		}catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
        
        
        
       
    }
    
    // Kayıt işlemimizi yapacak olan method.
    // Burada kayıt, sâdece userName ve password olarak
    // PicketLink üzerinden yapılacaktır.
    // Kullanıcının diğer bilgileri ise,
    // eposta adresine gönderilen linkin tıklanmasının ardından
    // açılacak olan ekran üzerinden alınacak ve 
    // MemberBean sınıfı kullanılarak veritabanına yazılacaktır.
   
    public void register() throws Exception {
   
        // Yeni kullanicinin ilk rollerini yaratmak
    	// ve UserAction'daki newFlag aracılığı ile 
    	// bunun yeni bir kullanıcı olduğunu bildirmek adına
    	// aşağıdaki methodu da çağırmalısın.
        userAction.createUser();
        
        
        userAction.setConfirm(userAction.getPassword());
        if(userAction.save().equals("success")){
        	 setMessage("Eposta adresinize gönderilen linke tıklayarak kullanıcı kaydını tamâmlayınız.");
        }
      
        mailGonder();
        
        log.info("Registering " + userAction.getUsername()); 
     
    }

    public void mailGonder(){
 
    	    UtilityMailClient mailClient=new UtilityMailClient();
    	    
	        mailClient.setEmailSubjectTxt(sirketAdi+ "Eğitim Sitesi");
	        
	        StringBuffer stringBuffer=new StringBuffer("");
	        stringBuffer.append(sirketAdi+ "Eğitim Sitesine Kaydınız yapılmıştır:<br/>");
	        stringBuffer.append(userAction.getPassword());
	        stringBuffer.append("<p>Lütfen tıklayın:</p>http://localhost:8080/egitim/?email=");
	        stringBuffer.append(userAction.getUsername());
	        
	 
	        stringBuffer.append("</p>");
	        
	        mailClient.setEmailMsgTxt(stringBuffer.toString());
	        
	        String[] recipients={userAction.getUsername()};
	        mailClient.setSendTo(recipients);
	        try {
				mailClient.sendSSLMessage(mailClient.getSendTo(), mailClient.getEmailSubjectTxt(), 
						mailClient.getEmailMsgTxt(), mailClient.getEmailFromAddress());
			} catch (MessagingException e) {
				 
				e.printStackTrace();
			}
	  }
 
    
    
}